package edu.ar.modulo3.perist.dao.impl.hbm;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.classic.Session;

import edu.ar.modulo3.model.AppConstants;
import edu.ar.modulo3.model.Cliente;
import edu.ar.modulo3.model.Empleado;
import edu.ar.modulo3.model.Usuario;
import edu.ar.modulo3.perist.common.HibernateManager;
import edu.ar.modulo3.perist.dao.IClienteDAO;
import edu.ar.modulo3.perist.dao.IEmpleadoDAO;
import edu.ar.modulo3.perist.dao.IUsuarioDAO;
import edu.ar.modulo3.perist.factory.BaseDAOFactory;

public class UsuarioDAOHbmImpl implements IUsuarioDAO {

	public void save(Usuario enttity) {
		// TODO Auto-generated method stub

	}

	public void update(Usuario enttity) {
		// TODO Auto-generated method stub

	}

	public void delet(Usuario enttity) {
		// TODO Auto-generated method stub

	}

	public List<Usuario> getAll() {
		// TODO Auto-generated method stub
		return null;
	}

	public Usuario getElemntById(Long id) {
		// TODO Auto-generated method stub
		return null;
	}

	public Usuario userExist(Usuario user) {
		
		Usuario usuarioResult =null;
		Session session = HibernateManager.getSessionFactoryInstance().openSession();
		
		try {
		
			session.beginTransaction();

			String hqlQuery = "from Usuario u where u.usuario like :usuario and u.password like :password ";
			Query query = session.createQuery(hqlQuery);			
			
			query.setParameter("usuario", user.getUsuario());
			query.setParameter("password", user.getPassword());
			
			usuarioResult = (Usuario) query.uniqueResult(); 
			
			if( usuarioResult.getIdTipoUsuario().intValue() == AppConstants.TIPO_CLIENTE_ID ) {
				
				usuarioResult.setPersona( getClienteById( usuarioResult.getIdPersona() ) );
				
			} else {
				
				usuarioResult.setPersona( getEmpleadoById( usuarioResult.getIdPersona() ) );					
			}
			
			session.getTransaction().commit();			
			
		} catch (Exception e) {			
			
			session.getTransaction().rollback();
			e.printStackTrace();
			return null;
			
		} finally {
			
			session.close();
			
		}
		
		return usuarioResult;
	}
	
	private Cliente getClienteById( Long id ) {
		IClienteDAO clienteDAO = BaseDAOFactory.getInstance().getClienteDAO();
		return clienteDAO.getElemntById(id);
	}
	
	private Empleado getEmpleadoById( Long id ) {
		IEmpleadoDAO empleadoDAO = BaseDAOFactory.getInstance().getEmpleadoDAO();
		return empleadoDAO.getElemntById(id);
	}

}
